package com.spzx.product.controller;

/**
 * @Author GQS @Date 2024/9/20/14:35 @Description
 */

import com.spzx.common.core.domain.R;
import com.spzx.common.core.web.controller.BaseController;
import com.spzx.common.core.web.domain.AjaxResult;
import com.spzx.common.security.annotation.InnerAuth;
import com.spzx.product.api.domain.vo.CategoryVo;
import com.spzx.product.service.CategoryService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 商品分类Controller
 */
@Tag(name = "商品分类接口管理")
@RestController
@RequestMapping("/category")
public class CategoryController extends BaseController {

    @Autowired
    private CategoryService categoryService;


    /**
     * 根据 hierarchical 权限控制，获取分类树形结构
     *
     * @return 返回分类树形结构的响应对象
     */
    @InnerAuth
    @GetMapping(value = "/tree")
    public R<List<CategoryVo>> tree() {
        return R.ok(categoryService.tree());
    }

    /**
     * 根据内部认证获取单个分类信息列表
     *
     * 此方法需要内部认证，即调用系统内部其他服务或模块时使用，确保系统的安全性
     * 通过GET请求访问"/getOneCategory"路径，返回一个封装了分类信息列表的响应结果
     *
     * @return 返回一个封装了分类信息列表的R对象，表示请求成功
     */
    @InnerAuth
    @GetMapping(value = "/getOneCategory")
    public R<List<CategoryVo>> getOneCategory() {
        return R.ok(categoryService.getOneCategory());
    }


    /**
     * 获取分类下拉树列表
     *
     * @param id 分类ID
     * @return 返回分类下拉树列表的AjaxResult对象
     */
    @Operation(summary = "获取分类下拉树列表")
    @GetMapping(value = "/treeSelect/{id}")
    public AjaxResult treeSelect(@PathVariable Long id) {
        return success(categoryService.treeSelect(id));
    }

    /**
     * 导出数据的控制器方法
     *
     * 该方法允许通过POST请求导出系统中的数据
     * 它调用categoryService中的exportData方法来处理导出操作
     * 使用HttpServletResponse来响应客户端的导出请求
     *
     * @param response HttpServletResponse对象，用于向客户端返回响应
     */
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        categoryService.exportData(response);
    }
    /**
     * 导入数据
     *
     * @param file 用户上传的文件
     * @return 导入操作的结果，成功或失败
     * @throws Exception 如果导入过程中发生错误，则可能抛出异常
     */
    @PostMapping("/import")
    public AjaxResult importData(MultipartFile file) throws Exception {
        try {
            // 调用categoryService的importData方法来执行实际的导入操作
            categoryService.importData(file);
            // 如果导入操作成功，返回成功消息
            return AjaxResult.success("导入成功");
        } catch (Exception e) {
            // 捕获并处理可能发生的任何异常，打印异常堆栈跟踪信息
            e.printStackTrace();
            // 如果导入操作失败，返回错误消息
            return AjaxResult.error("导入失败");
        }
    }






}